想要改善这篇文章吗?提供有关此问题的详细答案,包括引文和为什么您的答案正确的解释。答案不够详细的答案可能会被编辑或删除。 git pull和git fetch有什么区别?
1个 2 下一个 用最简单的术语来说,git pull进行git fetch,然后进行git merge。 您可以随时执行git fetch来更新refs / remotes //下的远程跟踪分支。 此操作永远不会更改引用/标题下的任何您自己的本地分支,并且可以安全地执行而无需更改工作副本。我什至听说有人在后台执行cron作业中定期运行git fetch(尽管我不建议这样做)。 git pull是您要执行的操作,以使本地分支机构的远程版本保持最新,同时还更新其他远程跟踪分支机构。 从git pull的Git文档中: 在默认模式下,git pull是git fetch的简写,其次是git merge FETCH_HEAD。 | 使用pull时,Git会尝试自动为您完成工作。它是上下文相关的,因此Git会将所有提交的提交合并到您当前正在使用的分支中。pull自动合并提交,而无需您先对其进行审查。如果您不严密管理分支机构,则可能会经常发生冲突。 提取时,Git会从目标分支中收集当前分支中不存在的所有提交,并将它们存储在本地存储库中。但是,它不会将它们与当前分支合并。如果您需要使存储库保持最新状态,但是正在进行某些可能会在更新文件时中断的工作,则此功能特别有用。 要将提交集成到您的master分支中,请使用merge。 | 必须将git的设计理念与更传统的源代码控制工具(如SVN)的理念进行对比。 Subversion是使用客户端/服务器模型设计和构建的。服务器是一个单一的存储库,几个客户端可以从服务器获取代码,对其进行处理,然后将其提交回服务器。假定客户端在需要执行操作时始终可以与服务器联系。 Git旨在支持一种更加分布式的模型,而无需一个中央存储库(尽管您当然可以使用一个存储库)。还设计了git,以便客户端和“服务器”不需要同时处于联机状态。 Git的设计目的是使链接不可靠的人甚至可以通过电子邮件交换代码。可以完全断开连接并刻录CD以通过git交换代码。 为了支持该模型,git会使用您的代码维护一个本地存储库,以及一个用于镜像远程存储库状态的附加本地存储库。通过在本地保留远程存储库的副本,即使无法访问远程存储库,git也可以找出所需的更改。稍后,当您需要将更改发送给其他人时,git可以将它们作为一组更改从远程存储库已知的时间点进行传输。 git fetch是这样的命令:“使我的远程存储库的本地副本最新。” git pull说“将远程存储库中的更改带到我自己保存代码的位置。” 通常,git pull通过执行git fetch来使远程存储库的本地副本保持最新,然后将更改合并到您自己的代码存储库以及可能的工作副本中来实现。 要记住的是,您的工作站上通常至少有三个项目的副本。一个副本是您自己的存储库,具有自己的提交历史记录。第二个副本是您正在编辑和构建的工作副本。第三个副本是远程存储库的本地“缓存”副本。 | 这是奥利弗·斯蒂尔(Oliver Steele)关于所有事物如何融合的图像: 如果有足够的兴趣,我想我可以更新图像以添加git clone和git merge ... | git fetch的一个用例是,以下内容将告诉您自上次拉取以来远程分支中的任何更改...,因此您可以在执行实际拉取之前进行检查,这可能会更改当前分支和工作副本中的文件。 git获取 git diff ...起源 有关diff命令中的双点和三点语法,请参见:https://git-scm.com/docs/git-diff | 我花了一点时间来了解有什么区别,但这只是一个简单的解释。本地主机中的master是分支。 克隆存储库时,会将整个存储库获取到本地主机。这意味着到那时您有一个指向HEAD的原点/主指针和指向同一HEAD的主指针。 当您开始工作并提交时,您可以将主指针前进到HEAD +您的提交。但是原点/主指针仍然指向克隆时的状态。 所以区别将是: 如果执行git fetch,它将仅获取远程存储库(GitHub)中的所有更改并将原始/主指针移至HEAD。同时,您的本地分支主管将继续指向其所在位置。 如果您执行git pull,它将基本上进行抓取(如前所述)并将所有新更改合并到您的master分支并将指针移到HEAD。 | 有时视觉表示会有所帮助。 | 简要地 git fetch与pull类似,但不会合并。即它获取远程更新(引用和对象),但您的本地保持不变(即,源/主服务器已更新,但主服务器保持不变)。 git pull从远程下拉并立即合并。 更多 git clone克隆一个仓库。 git rebase将当前分支中不在上游分支中的内容保存到临时区域。现在,您的分支与开始更改之前的分支相同。因此,git pull -rebase将拉下远程更改,倒回本地分支,在当前分支的顶部逐一重放所做的更改,直到最新为止。 另外,git branch -a会准确显示本地和远程所有分支的最新情况。 这篇博客文章很有用: git pull,git fetch和git clone(以及git rebase)之间的区别-Mike Pearce 并涵盖了git pull,git fetch,git clone和git rebase。 ==== 更新 我以为我会对此进行更新,以显示您实际上如何在实践中使用它。 从远程更新本地存储库(但不要合并): git获取 下载更新后,让我们看一下区别: git diff master来源/ master 如果您对这些更新感到满意,请合并: git pull 笔记: 在步骤2:有关本地和远程之间差异的更多信息,请参见:如何将本地git分支与其远程分支进行比较? 在第3步:在此处执行git rebase起源可能更准确(例如,在快速更改的仓库中)。参见@Justin Ohms的其他回答。 另请参阅:http://longair.net/blog/2009/04/16/git-fetch-and-merge/ | git-pull-从另一个存储库或本地分支获取并合并 概要 git pull… 描述 使用给定的参数运行git-fetch,并调用git-merge合并 检索到当前分支的头。使用--rebase,调用git-rebase 而不是git-merge。 请注意,您可以使用。 (当前目录)作为 拉 从本地存储库中获取-合并本地分支机构时,这很有用 进入当前分支。 还要注意,这些选项用于git-pull本身和底层git-merge 必须在用于git-fetch的选项之前给出。 如果您希望合并历史记录,那么您会选择拉动;如果您只是想“编码”,那么您会得到帮助,因为有人在这里标记了一些文章。 | 您可以从远程存储库中获取内容,查看差异,然后进行合并。 这是一个名为origin的远程存储库和一个名为master的分支的示例,该分支跟踪远程分支的origin / master: git checkout主 git获取 git diff起源/母版 git rebase原始主机 | 简短而简单的答案是git pull只是git fetch然后是git merge。 请务必注意,无论您是否喜欢,git pull都会自动合并。当然,这可能会导致合并冲突。假设您的远程服务器是源服务器,而您的分支机构是主服务器。如果在拉动前git diff origin / master,则应该对潜在的合并冲突有所了解,并可以相应地准备本地分支。 除了拉动和推入之外,一些工作流程还涉及git rebase,例如这一工作,我从链接的文章中进行了解释: git pull起源大师 git checkout foo-branch git rebase master git push origin foo-branch 如果发现自己处于这种情况,则可能会尝试使用git pull --rebase。除非您真的非常了解自己在做什么,否则我建议您不要这样做。此警告来自git-pull版本2.3.5的手册页: 这是潜在的危险操作模式。它重写 历史记录,当您发布该历史记录时预示情况并不理想 已经。除非已阅读git-rebase(1),否则请勿使用此选项。 小心。 | 好的,这里有一些有关git pull和git fetch的信息,因此您可以理解实际的区别...简单来说,fetch可以获取最新数据,但不会更改代码,也不会弄乱您当前的本地分支代码,但请获取代码更改并将其合并到您的本地分支中,继续阅读以获得有关每个代码的更多详细信息: git获取 它将所有参考和对象以及任何新分支下载到本地存储库... 从一个或多个中获取分支和/或标签(统称为“引用”) 其他存储库,以及完成存储库所需的对象 历史。远程跟踪分支已更新(请参阅说明 以下是控制此行为的方法)。 默认情况下,任何指向要提取的历史记录的标记都是 也拿来效果是获取指向分支的标签 您对此感兴趣。可以通过使用以下方式更改此默认行为: --tags或--no-tags选项或通过配置 remote..tagOpt。通过使用明确获取标签的refspec, 您可以获取不指向您感兴趣的分支的标签 在。 git fetch可以从中获取单个命名存储库或URL,或者 从多个存储库中一次给出(如果有) 遥控器。配置文件中的条目。 (参见git-config1)。 如果未指定任何远程,默认情况下,源远程为 使用,除非为当前配置了上游分支 科。 获取的引用的名称以及对象名称 他们指向,被写入.git / FETCH_HEAD。此信息可能是 由脚本或其他git命令(例如git-pull)使用。 git pull 它将更改从远程应用于本地的当前分支... 将更改从远程存储库合并到当前分支。 在默认模式下,git pull是git fetch的简写,后跟 git merge FETCH_HEAD。 更准确地说,git pull使用给定参数运行git fetch, 调用git merge将检索到的分支头合并到当前 科。使用--rebase,它将运行git rebase而不是git merge。 应该是传递给的远程存储库的名称 git-fetch1。可以命名任意的远程引用(例如, 标签的名称)甚至是带有相应内容的ref的集合 远程跟踪分支(例如refs / heads /:refs / remotes / origin /), 但通常是远程存储库中分支的名称。 和的默认值是从 由设置的当前分支的“远程”和“合并”配置 git-branch --track。 我还在下面创建了视觉效果,以向您展示git fetch和git pull如何一起工作... | 这种交互式的图形表示形式对于理解git很有帮助:http://ndpsoftware.com/git-cheatsheet.html git fetch只是将更改从远程“下载”到本地存储库。 git pull下载更改并将其合并到当前分支中。 “在默认模式下,git pull是git fetch的简写,然后是git merge FETCH_HEAD。” | 奖金: 说到上述答案中的拉取,我想分享一个有趣的技巧, git pull --rebase 上面的命令是我的git一生中最有用的命令,它节省了很多时间。 在将新提交推送到服务器之前,请尝试使用此命令,它将自动同步最新的服务器更改(通过访存+合并),并将您的提交放在git日志的顶部。无需担心手动拉/合并。 有关详细信息,请访问:http://gitolite.com/git-pull--rebase | 我喜欢对情况有一些直观的了解,以掌握这些东西。也许其他开发人员也希望看到它,所以这是我的补充。我不确定这是否正确,如果发现任何错误,请发表评论。 本地系统 。 ================================================== === ================= ================================================= 远程仓库。远程仓库本地仓库工作副本 (来源)。 (已封) 例如, 。镜子 github仓库。 。远程仓库 也可以是 。 多个仓库。 。 。 FETCH * ------------------> * 远程的本地缓存已使用源(或多个)更新 外部资源,即git的分布式性质) 。 拉 * - - - - - - - - - - - - - - - - - - - - - - - - --------> * 更改将直接合并到您的本地副本中。发生冲突时 您被要求做出决定。 。 提交。 * <--------------- * 例如,当来自颠覆时,您可能会认为 将更新原点。在git中,仅对本地仓库执行一次提交。 。 推* <--------------------------------------- * 将您的更改同步回原点。 获取远程镜像的一些主要优点是: 性能(滚动所有提交和消息,而无需尝试通过网络进行压缩) 关于您本地仓库状态的反馈(例如,我使用Atlassian的SourceTree,这将为我提供一个灯泡,指示相对于原产地,我是领先还是落后。可以使用GIT FETCH更新此信息)。 | 我也为此感到挣扎。实际上,我是通过Google搜索完全相同的问题来到这里的。读完所有这些答案后,我的脑海中终于有了一幅图画,我决定尝试着眼于2个存储库和1个沙箱的状态以及随着时间推移执行的操作,同时观察它们的版本。这就是我的想法。如果我在任何地方搞砸了,请纠正我。 三个回购协议: --------------------- ----------------------- ------ ----------------- -远程仓库--远程仓库--远程仓库- ---被推--- -@ R01--@ R02--@ R02- --------------------- ----------------------- ------ ----------------- --------------------- ---------------------------------------------- -本地仓库--本地仓库--本地仓库- -拉----获取- -@ R01--@ R01--@ R02- --------------------- ----------------------- ------ ----------------- --------------------- ----------------------- ------ ----------------- -本地沙箱--本地沙箱--本地沙箱- -结帐--完成新工作--- -@ R01--@ R01 +--@ R01 +- --------------------- ----------------------- ------ ----------------- 三个回购 --------------------- ----------------------- ------ ----------------- -远程仓库--远程仓库--远程仓库- ---被推--- -@ R01--@ R02--@ R02- --------------------- ----------------------- ------ ----------------- --------------------- ----------------------- ------ ----------------- -本地仓库--本地仓库--本地仓库- -拉----拉- -@ R01--@ R01--@ R02- --------------------- ----------------------- ------ ----------------- --------------------- ----------------------- ------ ----------------- -本地沙箱--本地沙箱--本地沙箱- -结帐--完成新工作--与R02合并- -@ R01--@ R01 +--@ R02 +- --------------------- ----------------------- ------ ----------------- 这有助于我理解为什么获取非常重要。 | GIT提取和GIT拉取之间的区别可以通过以下情形来解释: (请记住,图片胜于单词!,我提供了图片表示法) 让我们举个例子,您正在与团队成员一起进行项目。因此,将有一个项目的主分支,所有贡献者必须将其分叉到自己的本地存储库,然后在该本地分支上进行修改/添加模块,然后推回主分支。 所以, 当您在本地存储库中分叉主项目时,两个分支的初始状态将如下所示(A,B和C是该项目已完成的模块) 现在,您已经开始研究新模块(假设为D),并在完成D模块后将其推送到主分支,但是同时发生的是,您的一个队友已经开发了新的E,F和修改后的C。 因此,现在发生的事情是您的本地存储库缺少项目的原始进度,因此将更改推到主分支可能会导致冲突,并可能导致模块D发生故障。 为避免此类问题并与项目的原始进度并行进行,有两种方法: 1. Git Fetch-这将下载对Origin / main分支项目所做的所有更改,这些更改在您的本地分支中不存在。并且将等待Git Merge命令将已获取的更改应用于您的存储库或分支。 因此,现在您可以在将文件合并到存储库之前仔细监视文件。而且,由于修改了C,还可以根据需要修改D。 2. Git Pull-这会用origin / main分支更新您的本地分支,即实际上它是Git Fetch和Git相互合并的组合。 但这可能会引起冲突,因此建议使用干净副本的Git Pull。 | 我们只是说: git pull == git提取+ git merge 如果运行git pull,则无需将数据合并到本地。如果运行git fetch,则意味着必须运行git merge才能将最新代码获取到本地计算机。否则,如果不合并,将不会更改本地机器代码。 因此,在Git Gui中,当您提取数据时,必须合并数据。提取本身不会在您的本地更改代码。您可以在获取代码时检查代码是否更新 一旦获取并看到;不会更改的代码。然后合并...您将看到更改的代码。 | git fetch将代码从远程服务器下拉到本地存储库中的跟踪分支。如果您的遥控器被命名为origin(默认值),则这些分支将位于origin /之内,例如origin / master,origin / mybranch-123等。这些不是您当前的分支,它们是服务器中这些分支的本地副本。 。 git pull会进行git fetch,但也会将跟踪分支中的代码合并到您当前的代码中该分支的本地版本。如果您还没有准备好进行更改,请先git fetch。 | git fetch将检索远程分支,以便您可以git diff或git将它们与当前分支合并。 git pull将在当前分支跟踪的远程分支上运行访存,然后合并结果。您可以使用git fetch来查看远程分支是否有任何更新,而无需将其与本地分支合并。 | Git获取 您可以将更改从源下载到本地分支下载。 Fetch向远程存储库询问其他人进行的所有提交,但您没有在本地存储库上进行的所有提交。 Fetch下载这些提交并将其添加到本地存储库。 Git合并 您可以使用merge命令应用通过提取下载的更改。合并将采用从提取中检索的提交,并尝试将它们添加到本地分支。合并将保留本地更改的提交历史记录,这样,当您与push共享分支时,Git将知道其他人如何合并您的更改。 吉特拉 提取和合并经常一起运行,以至于创建了一个将两者(合并)的命令。 Pull先进行提取,然后进行合并,以将下载的提交添加到本地分支中。 | 简单来说,如果您要跳上没有任何互联网连接的飞机...在出发之前,您可以执行git fetch origin 。它会将所有更改取到您的计算机中,但将其与本地开发/工作区分开。 在飞机上,您可以更改本地工作区,然后将其与所获取的内容合并,并解决潜在的合并冲突,而无需连接到Internet。除非有人对远程存储库进行了新的更改,否则一旦到达目的地,您将执行git push origin 并获取咖啡。 从这个很棒的Atlassian教程中: git fetch命令从以下位置下载提交,文件和引用: 远程存储库到本地存储库。 当您想看到其他人拥有的东西时,便是您要做的事情 一直在努力。与SVN更新类似,它可以让您看到 中央历史如何发展,但这并不会迫使您 实际上将更改合并到您的存储库中。 Git分离株 从现有本地内容中获取内容,它绝对具有 对您的本地开发工作没有影响。必须使用git checkout命令显式地检出获取的内容。这使得 在将提交与集成之前,获取一种安全的方式来审查提交 您的本地存储库。 从远程存储库下载内容时,可以使用git pull和git fetch命令来完成任务。你可以考虑 git获取两个命令的“安全”版本。它将下载 远程内容,但不会更新本地存储库的工作状态, 保留您当前的工作。 git pull更积极 或者,它将下载活动本地的远程内容 分支并立即执行git merge创建合并提交 用于新的远程内容。如果您有待处理的变更 这将导致冲突并启动合并冲突解决方案 流。 使用git pull: 您没有任何隔离。 不需要显式签出。因为它隐式地进行了git合并。 合并步骤将影响您的本地发展并可能导致冲突 这基本上是不安全的。好斗 与git fetch不同,它仅影响您的.git / refs / remotes,而git pull将同时影响您的.git / refs / remotes和.git / refs / heads / 嗯...所以,如果我不使用git fetch更新工作副本,那么我在哪里进行更改? Git提取将新提交存储在哪里? 好问题。它将其放置在与工作副本隔离的位置。但是又在哪里?让我们找出答案。 在项目目录(即执行git命令的位置)中执行以下操作: ls。这将显示文件和目录。没什么好酷的,我知道。 现在执行ls -a。这将显示点文件,即以开头的文件。然后,您将能够看到一个名为:.git的目录。 执行cd .git。显然,这将更改您的目录。 有趣的来了;做ls。您将看到目录列表。我们正在寻找裁判。做cd refs。 看看所有目录中都有什么很有趣,但让我们集中讨论其中两个。头和遥控器。也使用cd检查它们的内部。 您执行的任何git fetch都会更新/.git/refs/remotes目录中的项目。它不会更新/.git/refs/heads目录中的任何内容。 任何git pull都会首先执行git fetch,更新/.git/refs/remotes目录中的项目,然后与本地文件合并,然后更改/.git/refs/heads目录中的文件头。 一个很好的相关答案也可以在“ git fetch”放置在何处?中找到。 另外,在Git分支命名约定中查找“斜杠表示法”。它可以帮助您更好地了解Git如何将事物放入不同的目录。 看实际差异 做就是了: git fetch origin master git checkout主 如果远程主服务器已更新,您将收到以下消息: 您的分支落后“起源/母版” 2次提交,并且可以快速转发。 (使用“ git pull”更新您的本地分支) 如果您没有获取而只是git checkout master,那么您本地的git将不知道添加了2个提交。它只会说: 已经在“主人”上 您的分支机构的最新信息是“来源/主”。 但这已经过时且不正确。这是因为git只会根据已知信息给您反馈。尚未提交的新提交遗忘了... 在本地工作分支时,是否有任何方法可以查看远程所做的新更改? 某些IDE(例如Xcode)非常聪明,可以使用git fetch的结果,并且可以注释当前工作分支的远程分支中已更改的代码行。如果该行已被本地更改和远程分支更改,则该行将用红色注释。这不是合并冲突。这是潜在的合并冲突。在从远程分支执行git pull之前,可以使用此提示来解决将来的合并冲突。 有趣的提示: 如果您获取了一个远程分支,例如做了: git fetch origin feature / 123 然后这将进入您的remotes目录。您的本地目录仍然不可用。但是,它通过DWIM简化了您到该远程分支的签出(执行我的意思): git checkout功能/ 123 您不再需要执行以下操作: git checkout -b功能/ 123 origin / feature / 123 有关更多信息,请点击此处 | git pull和git fetch之间的唯一区别是: git pull从远程分支中提取并合并。 git fetch仅从远程分支获取,但不合并 即git pull = git fetch + git merge ... | Git允许在时间上较早的提交在较新的提交之后应用。 因此,在存储库之间传输提交的操作分为两个步骤: 将新的提交从远程分支复制到本地仓库中的该远程分支的副本。 (回购到回购操作)master @ remote >> remote / origin / master @ local 将新提交集成到本地分支 (内部回购操作)remote / origin / master @ local >> master @ local 有两种方法可以执行步骤2。您可以: 在最后一个共同祖先之后分叉本地分支,并添加与本地存储库独有的提交平行的新提交,通过合并提交,关闭分叉来最终确定。 在最后一个共同祖先之后插入新的提交,然后重新应用本地存储库唯一的提交。 用git术语,第1步是git fetch,第2步是git merge或git rebase git pull是git fetch和git merge | Git使用以下两个命令来获取从远程到本地的最新版本的分支: git fetch:Git将从远程到本地获取最新版本,但是不会自动合并。 git fetch origin master git log -p master..origin / master git merge原始/主 上面的命令意味着从远程将主分支的最新版本从远程下载到起源主分支。然后比较本地主分支和原始主分支。最后,合并。 git pull:Git将从远程获取最新版本并合并到本地。 git pull起源大师 上面的命令等效于git fetch和git merge。实际上,git fetch可能更安全,因为在合并之前,我们可以看到更改并决定是否合并。 | git pull和git fetch有什么区别? 要了解这一点,您首先需要了解本地git不仅维护本地存储库,还维护远程存储库的本地副本。 git fetch使您的远程存储库本地副本保持最新状态。例如,如果您的远程存储库是GitHub-您可能希望将远程存储库中所做的所有更改都提取到远程存储库的本地副本中。这将允许您执行比较或合并之类的操作。 另一方面,git pull会将远程存储库中的更改放到保留您自己的代码的位置。通常,git pull将首先执行git fetch以使远程存储库的本地副本保持最新,然后将更改合并到您自己的代码存储库中,并可能合并到您的工作副本中。 | git pull ==(git fetch + git merge) git fetch不会更改为本地分支。 如果您已经有一个本地库,并为所需项目设置了远程设置,则可以使用git fetch获取现有远程设备的所有分支和标签。 ...提取不会对本地分支进行任何更改,因此您需要将远程分支与成对的本地分支合并以合并新的提取更改。来自github | 一个适合初学者的简单图形表示, 这里, git pull 将获取代码从存储库并使用本地本地库进行基础...在git pull中,可能会创建新的提交。 但在 , git获取 将从存储库中获取代码,我们需要使用git rebase手动对其进行重新设置 例如:我要从服务器主服务器获取并将其重新放置在本地主服务器中。 1)git pull(变底会自动完成): git pull起源大师 这是您的远程仓库主节点,是您的分支机构 2)git fetch(需要手动重新设置基准): git fetch origin master 它将从源获取服务器更改。并且它将一直存在于您的本地环境中,直到您自己重新建立基础为止。我们需要通过检查代码来手动解决冲突。 git rebase起源/主 这会将代码重新打包为本地代码。在此之前,请确保您在正确的分支中。 | 力求清晰和简单。 git pull命令实际上是git fetch的快捷方式,其后是git merge或git rebase命令,具体取决于您的配置。您可以配置您的Git存储库,以便git pull是先进行提取,然后进行重新设置。 | 实际上,Git会维护您自己的代码的副本,并且 远程存储库。 git fetch命令通过从远程存储库获取数据来使本地副本保持最新状态。我们之所以需要这样做,是因为其他人可能已经对代码进行了一些更改,而您想保持自己的最新状态。 git pull命令将远程存储库中的更改带到您保留自己的代码的位置。通常,git pull通过执行“ git fetch”来实现此目的,以使远程存储库的本地副本保持最新,然后将更改合并到您自己的代码存储库中,并可能合并到您的工作副本中。 | 1个 2 下一个 高度活跃的问题。赢得10个声誉才能回答这个问题。信誉要求有助于保护该问题免受垃圾邮件和非答复活动的侵害。 不是您要找的答案?浏览其他标记为git version-control git-pull git-fetch的问题,或询问您自己的问题。